package gis

import (
	"dgo/goutils/utils"
	"fmt"
	"math"
)

/***
 * 计算原理 (千寻基站分布)
 *   1：基站分布为菱形方式分布
 *      0,4       2,4           4,4
 *           1,3         3,3
 *      0,2       2,2           4,2
 *           1,1         3,1
 *      0,0       2,0           4,0
 *    2,   选取任意一个基站作为原点
 *    2.1  按照等距的方式，计算出临近的点
 *    2.2  如果改点为真实的(x % 2==y % 2）直接返回基站坐标
 *    2.3  如果不存在 计算Y轴，靠近哪一段，对Y轴进行+/-1 计算出真实点基站的编号
 */
func CalcuQxBaseLngLat(plng, plat float64) (lng, lat float64) {

	// 154作为原点
	baseX := 114.567
	baseY := 30.603
	spanX := 0.04779
	spanY := 0.02759375

	dx := (plng - baseX) / spanX
	dy := (plat - baseY) / spanY

	// 理论坐标点的x,y的序号
	dx1 := int(math.Round(dx))
	dy1 := int(math.Round(dy))

	// fmt.Printf("dx:%.4f, dx1:%d, dy:%.4f dy:%d\r\n", dx, dx1, dy, dy1);

	dx2 := utils.AbsInt(dx1 % 2)
	dy2 := utils.AbsInt(dy1 % 2)
	if dx2 == dy2 {
		return float64(dx1)*spanX + baseX, float64(dy1)*spanY + baseY
	}

	// 理论坐标点(bx1, by1)
	bx1 := float64(dx1)*spanX + baseX
	by1 := float64(dy1)*spanY + baseY

	fmt.Printf("x %.4f %.4f\r\n", bx1, by1)

	// 重算 y 的序号
	dy3 := plat - by1
	if dy3 <= 0 {
		dy1 = dy1 - 1
	} else {
		dy1 = dy1 + 1
	}

	return bx1, float64(dy1)*spanY + baseY
}

func CalcuBaseLngLat(plng, plat float64, grid_length_km float64) (lng, lat float64) {
	g := NewGisGrid(grid_length_km)
	g.Calculate(plng, plat)
	return g.Center.Lng, g.Center.Lat
}

func CalcuBaseLngLatGisPoint(plng, plat float64, grid_length_km float64, digitN int) *GisPoint {
	if grid_length_km <= 0 {
		grid_length_km = 1
		utils.Log.Warnf("传入的grid_length_km为0, 置为1")
	}
	g := NewGisGrid(grid_length_km)
	g.Calculate(plng, plat)
	powerN := math.Pow10(digitN)
	rval := &GisPoint{
		Lng: math.Round(g.Center.Lng*powerN) / powerN,
		Lat: math.Round(g.Center.Lat*powerN) / powerN,
	}
	return rval
}
